// Texas A&M University          //
// cpsc321 Computer Architecture //
// Modified by Mitchell Kline on 4/11/2007

// NOTE:  Expanded these tests to cover all instructions supported by your datapath //

initial	begin

// 
// Test Program 1
//  tests lw, add, addi, sw
   Mem[0] = {6'd35,5'd0,5'd1,16'd404};
   //			lw	$1, 404($0)	# $1 = 1
   Mem[1] = 0;
   //
   Mem[2] = {6'd35,5'd0,5'd2,16'd408};
   //			lw      $2, 408($0)	# $2 = 2
   Mem[3] = 0;
   //
   Mem[4] = {6'd0,5'd1,5'd2,5'd1,5'd0,6'd32};
   //			add $1, $1, $2   	# $1 = $1 + $2 ($1 = 3)
   Mem[5] = {6'd0,5'd1,5'd1,5'd2,5'd0,6'd32};
   //			add	$2, $1, $1	# $2 = $1 + $1 ($2 = 6)
   Mem[6] = {6'd8,5'd2,5'd3,16'd100};
   //			addi    $3, $2, 100	# $3 = $2 + 100 ($3 = 106)
   Mem[7] = {6'd43,5'd0,5'd3,16'd4};
   //                   sw      $3, 4($0)       # Mem[1] = $3 (Mem[1] = 106)
   Mem[8] = {6'd35,5'd0,5'd5,16'd4};
   //                   lw      $5, 4($0)       # load the result (106)
   Mem[9] = 0;
   //
   Mem[10] = 0;
   //
   Mem[11] = 0;


   // Test Program 2
   //  tests addi, sub, slt, and
   Mem[14] = {6'd8,5'd0,5'd1,16'd1};
   //			addi	$1, $0, 1	# $1 = 1
   Mem[15] = {6'd0,5'd0,5'd1,5'd2,5'd0,6'd34};
   //			sub	$2, $0, $1	# $2 = -1
   Mem[16] = {6'd0,5'd2,5'd0,5'd5,5'd0,6'd42};
   //			slt	$5, $2, $0	# $5 = 1
   Mem[17] = {6'd0,5'd1,5'd5,5'd6,5'd0,6'd32};     
   //			add	$6, $1, $5      # $6 = 2
   Mem[18] = {6'd0,5'd1,5'd6,5'd7,5'd0,6'd37};
   //			or	$7, $1, $6	# $7 = 3
   Mem[19] = {6'd0,5'd5,5'd7,5'd8,5'd0,6'd34};
   //			sub	$8, $5, $7	# $8 = -2
   Mem[20] = {6'd0,5'd8,5'd6,5'd9,5'd0,6'd36};
   //			and	$9, $8, $6	# $9 = 2
   Mem[21] = {6'd43,5'd0,5'd9,16'd8};
   //			sw	$9, 8($0)	# store $9 in DMem[2]
   Mem[22] = {6'd35,5'd0,5'd30,16'd8};
   //                   lw      $30,8($0)
   Mem[23] = {6'd0,5'd0,5'd0,16'd0};
   //			nop			# read Dmem[2]
   
   //
   // Test Program 3
   //   Tests j, jr, and jal
   //   Should execute lines 30, 31, 33, 34, 36, 38
   //   Value of $1 should be 128
   Mem[30] = {6'd8,5'd0,5'd1,16'd136};
   //     addi $1,$0,136   # $1 = jr:0x84 (136)
   Mem[31] = {6'd2,26'd34};
   //     j  136
   Mem[32] = 0;
   // 
   Mem[33] = {6'd8,5'd0,5'd1,16'd128};
   //     addi $1, $0, 128  # $1 = 128
   Mem[34] = {6'd8,5'd1,5'd2,16'd16};
   //     addi $2, $1, 16                  # $2 = $1 + 10 = 152
   Mem[35] = {6'd0,5'd2,5'd0,5'd0,5'd0,6'd8};
   //     jr $2
   Mem[36] = 0;
   //
   Mem[37] = {6'd8,5'd0,5'd1,16'd66};
   //     addi $1, $0, 66                  # should not execute 
   Mem[38] = {6'd8,5'd0,5'd3,16'd1};
   //     addi $3, $0, 1                   # $3 = 1
   Mem[39] = {6'd3, 26'd44};
   //     jal 176                          # jump to label1
   Mem[40] = 0;
   //     nop
   Mem[41] = {6'd2,26'd47};
   //     j 188				   # jump to end
   Mem[42] = 0;
   //     nop
   Mem[43] = {6'd8,5'd0,5'd6,16'd6};
   //     addi $6, $0, 6                    # should not execute
   Mem[44] = {6'd8,5'd0,5'd7,16'd7};
   //     label1: addi $7, $0, 7
   Mem[45] = {6'd0,5'd31,5'd0,5'd0,5'd0,6'd8};
   //     jr $31 			    # return to 40
   Mem[46] = 0;
   //     nop
   Mem[47] = {6'd8, 5'd0, 5'd8, 16'd8};
   //     end: addi $8, $0, 8
   Mem[48] = {6'd43,5'd0,5'd7,16'd12};
   //     sw $7, 12($0)                     # result = 7
   Mem[49] = {6'd35,5'd0,5'd30,16'd12};
   //     lw $30, 12($0)
   Mem[50] = 0;
   //     nop

   //
   // Test Proram 4
   //   Tests addiu, addi, andi, ori, xori
   Mem[60] = {6'd9,5'd0,5'd1,16'hFFFF};
   //     addiu  $1, $0, 0xFFFF # $1 = 0x0000FFFF
   Mem[61] = {6'd9,5'd1,5'd2,16'hffff};
   //     addiu  $2, $1, 0xFFFF # $2 = 0x0001FFFE
   Mem[62] = {6'd8,5'd2,5'd3,16'd1};
   //     addi   $3, $2, 1      # $3 = 0x0001FFFF
   Mem[63] = 0;
   //     nop
   Mem[64] = {6'd8,5'd2,5'd4,16'hffff};
   //     addi   $4, $2, -1     # $4 = 0x0001FFFD
   Mem[65] = {6'd9,5'd0,5'd5,16'haaaa};
   //     addiu  $5, $0, 0xAAAA # $5 = 0x0000AAAA
   Mem[66] = {6'd12,5'd5,5'd6,16'hff00};
   //     andi   $6, $5, 0xFF00 # $6 = 0x0000AA00
   Mem[67] = 0;
   //     nop
   Mem[68] = {6'd13,5'd5,5'd7,16'hff00};
   //     ori    $7, $5, 0xFF00 # $7 = 0x0000FFAA
   Mem[69] = {6'd14,5'd5,5'd8,16'hffff};
   //     xori   $8, $5, 0xFFFF # $8 = 0x00005555
   Mem[70] = {32'd0};
   //     nop
   


   //
   // Test Program 5
   //   Tests sll, sra, srl, sw, li
   Mem[71] = {6'd35,5'd0,5'd1,16'd240};
   //     lw    $1, 240($0)     # $1 = 0xFFFF0000
   Mem[72] = 0;
   //     nop
   Mem[73] = {6'd0,5'd1,5'd0,5'd2,5'd4,6'd0};
   //     sll   $2, $1, 4       # $2 = 0xFFF00000
   Mem[74] = {6'd0,5'd1,5'd0,5'd3,5'd4,6'd3};
   //     sra   $3, $1, 4       # $3 = 0xFFFFF000
   Mem[75] = {6'd0,5'd1,5'd0,5'd4,5'd4,6'd2};
   //     srl   $4, $1, 4       # $4 = 0x0FFFF000
   Mem[76] = {6'd8,5'd0,5'd5,16'd244};
   //     addi  $5, $0, 244     # $5 = 244
   Mem[77] = {6'd43,5'd5,5'd1,16'd0};
   //     sw    $1, 0($5)       # Mem[61] = 0x0FFFF000
   Mem[78] = {6'd35,5'd5,5'd5,16'd0};
   //     lw    $5, 0($5)       # $5 = 0xFFFF0000
   Mem[79] = 0;
   //     nop
   Mem[80] = {6'd15,5'd0,5'd6,16'h2004};
   //     li   $6, 0x2004      # $6 = 0x00002004
   Mem[81] = {32'd0};
   //     nop
  
   //
   // Test Program 8
   //   Tests addu, subu, slti, bne
   Mem[90] = {6'd8,5'd0,5'd1,16'd1};
   //     addi  $1, $0, 1       # $1 = 1
   Mem[91] = {6'd0,5'd0,5'd1,5'd2,5'd0,6'd34};
   //     sub   $2, $0, $1      # $2 = -1
   Mem[92] = 0;
   //     nop
   Mem[93] = 0;
   //      nop
   Mem[94] = {6'd0,5'd1,5'd2,5'd3,5'd0,6'd33};
   //     addu  $3, $1, $2      # $3 = 0, Overflow = 1
   Mem[95] = {6'd0,5'd2,5'd1,5'd4,5'd0,6'd35};
   //     subu  $4, $2, $1      # $4 = 0xFFFFFFFE
   Mem[96] = {6'd5,5'd0,5'd0,16'd5};
   //     bne   $0, $0, no      # shouldn't branch
   Mem[97] = 0;
   //     nop
   Mem[98] = 0;
   //      nop
   Mem[99] = {6'd5,5'd1,5'd2,16'd3};
   //     bne   $1, $2, yes     # should branch
   Mem[100] = 0;
   //     nop
   Mem[101] = 0;
   //      nop
   Mem[102] = {6'd8,5'd0,5'd8,16'd666};
   // no: addi  $8, $0, 666    # should never execute
   Mem[103] = {6'd10,5'd2,5'd5,16'd0};
   // yes:slti  $5, $2, 0       # $5 = 1
   Mem[104] = {6'd10,5'd0,5'd6,16'd2};
   //     slti  $6, $0, 2       # $6 = 1
   Mem[105] = {6'd10,5'd0,5'd7,16'd0};
   //     slti  $7, $0, 0       # $7 = 0
   Mem[106] = {32'd0};
   //     nop

end
